import scrapy
from itcast.items import JobItem


class Job163Spider(scrapy.Spider):
    name = 'job163'
    allowed_domains = ['163.com']
    start_urls = ['https://hr.163.com/position/list.do']

    def parse(self, response):
        # 对数据进行分组
        tr_list = response.xpath("//table[@class='position-tb']//tr")
        # print(tr_list)
        # 取出有数据的tr 构成新的列表
        tr_list = [tr for tr in tr_list if tr_list.index(tr) % 2 != 0]

        # 遍历 取出每一条数据
        for tr in tr_list:
            item = JobItem()
            # 获取职位名称
            item["name"] = tr.xpath("./td[1]/a/text()").extract_first()
            # print(item)
            item["detail_url"] = "https://hr.163.com/" + tr.xpath("./td[1]/a/@href").extract_first()
            # 构造详情页的请求
            yield scrapy.Request(
                item["detail_url"],
                # 提取详情页增加之前callback指定的parse_detail函数
                callback=self.parse_detail,
                # meta参数的作用：meta可以实现数据在不同的解析函数中的传递
                meta={"item": item}
            )

        # 获取下一页的url地址
        next_url = response.xpath("//a[text()='>']/@href").extract_first()
        print(next_url)
        # 判断 是否是最后一页
        if next_url != "javascript:void(0)":
            # 构造Request对象,并发送请求,实现方法:
            # 1.构造完整的url地址
            next_url = "https://hr.163.com/position/list.do" + next_url
            # 构造request请求对象,并yield给引擎
            # 2.构造请求　scrapy.Request(url, callback)
            # 3.把请求交给引擎 yield scrapy.Request(url,callback)
            # 利用callback参数指定该Request对象之后获取的响应用哪个函数进行解析
            yield scrapy.Request(
                url=next_url,
                # 不指定 默认就是parse方法
                callback=self.parse
            )

    def parse_detail(self, response):
        # 接收列表页传递的数据
        item = response.meta["item"]
        # 发布时间
        item["pub_date"] = response.xpath("//p[@class='post-date']/text()").extract_first()
        print(item)
